/**
 * 产品互斥关系映射库
 *
 */
class Exclusion {
	constructor(data) {
		this.data = data;
		this.exclusionMap = Object.create(null);
	}
	
	/**
	 * 初始化得到结果
	 * @return {Object} 
	 * @example 
	 * {
	 * 	产品id_类型: [产品id, 产品id, ...]
	 * }
	 * @description 类型：1选项组内互斥; 2产品内互斥
	 * */    
	init() {
		for (let item of this.data) {
			let type = item.EXT1 || 1; // 1选项组内互斥; 2产品内互斥
			const productIdList = item.PRODUCTS.split(',') || [];
			for (let proid of productIdList) {
				const exclusionProIds = this._remove([...productIdList], proid);
				if (!this.exclusionMap[`${proid}_${type}`]) {
					this.exclusionMap[`${proid}_${type}`] = exclusionProIds;
					continue;
				}
				
				this.exclusionMap[`${proid}_${type}`] = [
					...new Set([
						...this.exclusionMap[`${proid}_${type}`],
						...exclusionProIds
					])
				];
			}
		}
		return Object.freeze(this.exclusionMap); // 冻结此数据，不能改变
	}


	// 删除键名相同的内容 
	_remove(list, item) {
		const index = list.indexOf(item);
		if (index > -1) {
			list.splice(index, 1);
		}
		return list;
	}
}

module.exports = Exclusion;
